iT邦幫忙

DAY 27
4

Android 學習手札系列 第 27

Day 27 - Android - 自我

  • 分享至 

  • xImage
  •  

今天就正式為各位介紹如何自定 ListView 的介面

今天的專案就麻煩各位再直接複製昨天的過來嘍,專案名稱為「Day27_ListIII」

先來看看原本在 Moogle3Activity.java 的程式區塊,

setListAdapter(
    new SimpleAdapter(
        this, 
        leaders,
        android.R.layout.simple_list_item_2,
        new String[]{NAME, CREATION}, 
        new int[]{android.R.id.text1, android.R.id.text2}));

在 Moogle3 是化身(繼承)為 ListActivity 的這個情形下,本來需要針對 ListView 的部份,只要確定被拉到介面上的 Listview 元素 id 被命名為:@id/android:list,我們都可以直接以

setListAdapter(SimpleAdapter);

的方式來給予設定值,而 SimpleAdapter 是「Adapter(轉換器)」類別的一種,他的在這裡的意義就是為我們將必要的資料轉換成 List 所需要的樣子並放進去給他。而這個轉換器裡面的參數在「Day 25 - Android - 簡介與列表」裡也有介紹過,而今天我們要看的是第三個參數:resource,也就是在上面程式碼裡面代入"android.R.layout.simple_list_item_2"的這個預設介面資源(resource),所以接下來請各位新增一個 Moogle5,其介面只要很單純的放入一個 ListView 即可

請注意這個 ListView 的 ID 要命名為**@id/android:list**

再來,請各位跟著步驟來新增一個 "Layout",請點下左上圖示工具列的新增圖示後選擇「Android XML Layout File」

給予一個檔案名稱:「listview_item」 並選擇 LinearLayout 為根元素

再來,如下圖,拉入兩個 TextView 並分別命名為 txt_title 以及 txt_subtitle

如何!這麼一來就跟預設的"android.R.layout.simple_list_item_2"有一定的相似度了,就是兩個TextView,只差別在字體的大小而已,這時候,我們就來看到 Moogle5 的程式碼了,原則上,這邊的程式碼跟 Moogle3 是差不多的,只差在 Moogle3 有按鈕而已,所以請各位自行重建之,這邊就直接針對重點,也就是 SimpleAdapter 這個轉接器來說明之。
可以感覺得到這邊要改什麼了嗎?

就是上面提到的第三個參數:resource,這裡就將之改為「R.layout.listview_item」也就是我們剛剛設定好的介面哦!再來還有一個地方要改~
第五個參數-to,要放到介面裡的哪個元素,本來是

new int[]{android.R.id.text1, android.R.id.text2}

這兩個預設介面裡的元素的 id 陣列,而現在要改為我們自己定義好的元素 id 介面

new int[]{R.id.txt_title, R.id.txt_subtitle}

所以這段的程式碼如下

setListAdapter(
    new SimpleAdapter(
            this, 
            leaders,
            R.layout.listview_item,//原本是:android.R.layout.list_content,
            new String[]{NAME, CREATION}, 
            new int[]{R.id.txt_title, R.id.txt_subtitle}
            //new int[]{android.R.id.text1, android.R.id.text2}
    ));

這樣,其實就完成了,馬上來看看執行出來的結果

為了要讓各位比較有感覺,所以將之跟上個範例的結果呈現疊在一起讓大家比較一下。

將介面改為自己設定的這樣,只是模仿而已,而且還沒有模仿完全XD
所以我們還要超越之!我們來做成下圖的樣子吧

這邊,在下準備了四張圖示,皆是 64 x 64 的大小,各位可以自行準備,不然請至 Mosil Github 上下載專案程式後直接取出使用之也行。

準備好了後,我們就來新增這個圖片的元件吧

這個圖片的元件是在「Images & Media」裡的 ImageView,將他拉到我們的元素清單上,這時會出現如圖中看到的 "Resource Chooser" 的視窗,選擇預設的圖片。再來就請各位自行根據在下提供的下圖,嘗試著排出這個樣子嘍

其實就算沒排也無妨,只是會變成一個元素自己一列而已XD,只要注意 id 名稱的命名即可。

再來回過頭來看過 Moogle5Activity.java 的程式內容,因為多了圖片的元件,所以,除了本來的兩個字串陣列外,還要再追加一個圖片的 id 陣列

int[] logos = {R.drawable.mosil_logo_s, R.drawable.mosil_logo_k, R.drawable.mosil_logo_e};

這邊一樣是要對應到字串陣列中的順序!
若您是自行準備圖片的,請留意您圖片資源的名稱都要是小寫哦!
別忘了,要另外宣告一個全域的常數名稱

private final String LOGO = "logo";

再來是 ArrayList 裡面也要再加入這個物件

leader.put(NAME, names[i]);
leader.put(CREATION, creation[i]);
leader.put(LOGO, logos[i]);
leaders.add(leader);

最後要準備的就是我們的轉接器-adapter物件了,這次我們換個寫法,將 SimpleAdapter 拉出來獨自宣告之

SimpleAdapter adapter = new SimpleAdapter(
        this, 
        leaders, 
        R.layout.listview_item, //我們自己設計的介面
        new String[]{NAME, CREATION, LOGO}, //LOGO 為新加入的常數
        new int[]{R.id.txt_title, R.id.txt_subtitle, R.id.img_logo} //如上述,多加了多三個圖片元素的 ID,請注意對應的順序!
);
setListAdapter(adapter);  //將定義好的轉接器放入

可能有人會覺得奇怪,從畫面上看來 ImageView 不該是被放在第一順位的元素嗎?為什麼說明文字說要注意對應的順序,但這裡的 ImageView 卻放在最後?

若您有注意到這個部份,那可真是個好問題呢!

這裡的元素放入順位可以跟介面上的順序完全不同,在轉接器中,只要在意放進去的陣列元素順序,也就是說,我們的 from 跟 to 這兩個陣列裡的元素順序可以跟介面不同,但是要注意的是二者之間的"對應順序",也就是說,我們的NAME就是對應到R.id.txt_title,其他亦然!要照著介面順序去擺放全是為了我們"人"看了順眼,以及人眼去比對時,比較不會有錯亂的狀況而已,所以沒有強制跟介面元素的順序對應,所以請小心這個部份。

只是,會不會本來沒說,大家都覺得沒問題,結果這麼一段像繞口的描述下來,反而讓大家錯亂了呢XD
總之,趕快執行看看,看自己跑來的樣子是否在下的結果差不多呢^_^

後話:本來想要直接用三個角色的圖片來做為圖示,會比較有感覺,不過怕有版權的問題,所以自己就另外準備了,有興趣的朋友,再麻煩您自行發揮創意嘍!

Day 26 - Android - 第二個世界元素《 》Day 28 - Android - R命脈


上一篇
Day 26 - Android - 第二個世界元素
下一篇
Day 28 - Android - R命脈
系列文
Android 學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ted99tw
iT邦高手 1 級 ‧ 2012-12-20 17:07:36

衝刺衝刺衝刺

朝辭白帝彩雲間,千里江陵一日還....

看大大的文章真是舒暢呀...

mosil iT邦新手 4 級 ‧ 2012-12-20 22:59:15 檢舉

您真厲害
一天就看了那麼多篇讚

ted99tw iT邦高手 1 級 ‧ 2012-12-21 06:44:54 檢舉

因為小綠人的文章真的很通順,而且...末日快到要抓緊時間...臉紅

我要留言

立即登入留言